package com.asen.commons.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 有该注解的方法
 * 自动添加分布式锁，添加锁的默认策略如下：
 * 1）如果方法没有参数，lock没有指定key：则默认为当前用户userId添加锁
 * 2）如果方法有且只有一个参数，lock没有指定key：则默认该参数为key（如果参数值为空，则为当前用户操作添加锁）
 * 3）如果方法有多个参数（或对象），参数（或对象）中有id：则默认以id作为key（如果id值为空，则为当前用户操作添加锁）
 * 4）如果方法有多个参数（或对象），参数（或对象）中没有id：则默认为当前用户操作添加锁
 * 5）如果lock指定key，但指定key的值为空，则抛出异常
 *
 * @author Gonyb
 * @date 2018/7/18
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Lock {

    /**
     * 表示对该方法添加全局分布式锁，方法严格同步执行
     */
    public static final String ALL = "all";

    /**
     * "userId" 表示对当前用户操作添加锁
     */
    public static final String USER_ID = "userId";

    /**
     * 参数id
     */
    public static final String ID = "id";

    /**
     * 指定参数属性作为锁的key值
     * 1）如果传"userId"表示对当前用户操作添加锁；
     * 2）如果传"all"，表示对方法添加锁，方法对所有用户操作互斥
     *
     * @return
     */
    String value() default "";

    /**
     * 自定义key前缀,如果为空,默认以类名+方法名,代表锁定当前方法
     *
     * @return
     */
    String keyPrefix() default "";

    /**
     * 过期时间 默认10秒
     */
    long timeOut() default 10000;

}
